package com.luboyan.CBillbill.service.file;

import com.luboyan.CBillbill.dao.file.*;
import com.luboyan.CBillbill.dao.vo.PageVo;
import org.apache.mahout.cf.taste.common.TasteException;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public interface VideoService {

    /**
     * 新增视频
     */
    void addVideos(Video video);

    /**
     * 根据分区分页返回视频
     */
    PageVo<Video> pageVoVideos(Integer page, Integer pageSize, String area);

    /**
     * 根据用户id返回视频
     */
    PageVo<Video> getVideosByUserId(Integer page, Integer pageSize, Long userId);

    /**
     * 根据videoId获取视频
     */
    Video getVideoById(Long videoId);

    /**
     * 分片下载视频,通过流进行传输
     */
    void getVideosByShard(HttpServletRequest request, HttpServletResponse response, String path) throws Exception;

    /**
     * 点赞视频
     */
    void addVideoLike(Long videoId, Long userId);

    /**
     * 取消点赞
     */
    void deleteVideoLike(Long videoId, Long userId);

    /**
     * 查询视频点赞
     */
    Map<String, Object> getVideoLikes(Long videoId, Long userId);

    /**
     * 收藏视频
     */
    void addVideoCollections(VideoCollection videoCollection, Long userId);

    /**
     * 取消收藏
     */
    void deleteVideoCollections(Long videoId, Long userId);

    /**
     * 获取视频收藏量
     */
    Map<String, Object> getVideoCollections(Long videoId, Long userId);

    /**
     * 用户添加视频关注分组
     */
    Long addUserFollowingGroups(CollectionGroup collectionGroup);

    /**
     * 用户获取视频关注分组
     */
    List<CollectionGroup> getVideoCollectionGroup(Long userId);

    /**
     * 得到收藏视频
     * @return 以分组的形式返回给前端
     */
    PageVo<Video> PageVideoCollectionGroup(Integer page, Integer pageSize, Long userId, Long groupId);

    /**
     * 用户给视频进行投币
     */
    void addVideoCoins(VideoCoin videoCoin, Long userId);

    /**
     * 获取视频投币量
     */
    Map<String, Object> getVideoCoins(Long videoId, Long userId);

    /**
     * 添加视频评论
     */
    void addVideoComments(VideoComment videoComment, Long userId);

    /**
     * 查询视频评论
     */
    PageVo<VideoComment> PageGetVideoComments(Integer page, Integer pageSize, Long videoId);

    /**
     * 获取视频详情
     */
    Map<String, Object> getVideoDetails(Long videoId);

    /**
     * 添加视频观看记录
     */
    void addVideoView(VideoView videoView, HttpServletRequest request);

    /**
     * 查询视频播放量
     */
    Integer getVideoViewCounts(Long userId);

    /**
     * 视频推荐（基于用户）
     */
    List<Video> recommend(Long userId) throws TasteException;

    /**
     * 基于内容的协同推荐
     * @param userId 用户id
     * @param itemId 参考内容id（根据该内容进行相似内容推荐）
     * @param howMany 需要推荐的数量
     */
    List<Video> recommendByItem(Long userId, Long itemId, int howMany) throws TasteException;

    /**
     * 获取所有视频分页返回
     */
    PageVo<Video> pageVoAllVideos(Integer page, Integer pageSize);

    /***
     * 查询标签
     */
    ArrayList<Tag> getTags();
}
